/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * PCrearMapa2.java
 *
 * Created on 21-sep-2011, 13:45:56
 */
package View.Almacen.BloquearUbicacion;

import java.awt.Color;
import java.awt.Graphics;
import java.io.BufferedReader;
import java.io.FileOutputStream; 
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
 *
 * @author Michael
 */
public class PPanel extends javax.swing.JPanel {

    private PCargarMapa PMapa=null;
    private FBloquearUbicacion padre=null;
    private  int arrNumeros[][];
    private int numUbi=0;
    Random rd;
    /** Creates new form PCrearMapa2 */
    public PPanel(PCargarMapa p,FBloquearUbicacion padre) {
        PMapa=p;
        rd = new Random(System.currentTimeMillis()); 
        this.padre=padre;
        initComponents();      
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jTextField1 = new javax.swing.JTextField();

        jButton1.setText("Aceptar");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jLabel1.setText("Codigo Ubicacion:");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(53, 53, 53)
                        .addComponent(jButton1)))
                .addContainerGap(36, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(41, 41, 41)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(29, 29, 29)
                .addComponent(jButton1)
                .addContainerGap(248, Short.MAX_VALUE))
        );
    }// </editor-fold>//GEN-END:initComponents


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
// TODO add your handling code here:
    //primero lleno MUbi
    padre.MUbi=new int[padre.AltoMapa][padre.AnchoMapa];
    for (int i=0;i<padre.AltoMapa;i++){
        for (int j=0;j<padre.AnchoMapa;j++){
            if (PMapa.botones[i][j].getBackground()==Color.ORANGE)
                padre.MUbi[i][j]=1;
            else
                padre.MUbi[i][j]=0;
        }
    }
    
    //calculo numeros y lleno Numeros
    int num=1;
    arrNumeros=new int[padre.AltoMapa][padre.AnchoMapa];
    for (int i=0;i<padre.AltoMapa;i++){
        for (int j=0;j<padre.AnchoMapa;j++){
            if (padre.MMapa[i][j]==0){
                if (EsNumero(i,j)==true){
                    PMapa.botones[i][j].setText(""+num);
                    arrNumeros[i][j]=num;
                    num++;
                }
                else{
                    arrNumeros[i][j]=0;
                    PMapa.botones[i][j].setText("");
                }
            }
            else{
                arrNumeros[i][j]=0;
                PMapa.botones[i][j].setText("");
            }
        }
    }
    
    //lleno los costos
    int costos[][]=new int[num][num];
    int cont;
    
    for (int i=0;i<num;i++)
        for (int j=0;j<num;j++)
            costos[i][j]=0;
    
    for (int i=0;i<padre.AltoMapa;i++){
        for (int j=0;j<padre.AnchoMapa;j++){
            if (arrNumeros[i][j]!=0){
                //abajo
                cont=1;
                for (int k=i-1;k>=0;k--){
                    if (padre.MMapa[k][j]!=0)
                        break;
                    if (arrNumeros[k][j]!=0){
                        costos[arrNumeros[i][j]][arrNumeros[k][j]]=cont;
                        costos[arrNumeros[k][j]][arrNumeros[i][j]]=cont;
                        break;
                    }
                    cont++;
                }
                //arriba
                cont=1;
                for (int k=i+1;k<padre.AltoMapa;k++){
                    if (padre.MMapa[k][j]!=0)
                        break;
                    if (arrNumeros[k][j]!=0){
                        costos[arrNumeros[i][j]][arrNumeros[k][j]]=cont;
                        costos[arrNumeros[k][j]][arrNumeros[i][j]]=cont;
                        break;
                    }
                    cont++;
                }
                //izquierda
                cont=1;
                for (int k=j-1;k>=0;k--){
                    if (padre.MMapa[i][k]!=0)
                        break;
                    if (arrNumeros[i][k]!=0){
                        costos[arrNumeros[i][j]][arrNumeros[i][k]]=cont;
                        costos[arrNumeros[i][k]][arrNumeros[i][j]]=cont;
                        break;
                    }
                    cont++;
                }
                //derecha
                cont=1;
                for (int k=j+1;k<padre.AnchoMapa;k++){
                    if (padre.MMapa[i][k]!=0)
                        break;
                    if (arrNumeros[i][k]!=0){
                        costos[arrNumeros[i][j]][arrNumeros[i][k]]=cont;
                        costos[arrNumeros[i][k]][arrNumeros[i][j]]=cont;
                        break;
                    }
                    cont++;
                }    
            }
        }    
    }    
    // ya llene los costos
    
    
    
    int arrUbi[]=new int[numUbi+1];
    
    //20070263 añado source
    
    cont=0;
    for (int i=0;i<padre.AltoMapa;i++)
        for (int j=0;j<padre.AnchoMapa;j++){
            if (padre.MUbi[i][j]!=0){
                arrUbi[cont]=arrNumeros[i][j];
                cont++;
            }
        }
    
    
    
    class cosa{
        int valor;
        int x;
        int y;
    }
    List<cosa> lista2 =new ArrayList<cosa>();
    
    
    cosa c= new cosa();
    int contador;
    contador=0;
    
    
    for (int i=0;i<padre.AltoMapa;i++)
        for (int j=0;j<padre.AnchoMapa;j++){
            if (padre.MUbi[i][j]==1){
                c= new cosa();
                c.x=j;
                c.y=i;
                c.valor=contador;
                lista2.add(c);
                contador++;
            }
        }
    
    
    int primerrr[][]=new int[10][cont];
   for (int iii=0;iii<10;iii++){
    
        List<cosa> lista =new ArrayList<cosa>();
        for (int jj=0;jj<lista2.size();jj++){
            cosa cc=new cosa();
            cc.valor=lista2.get(jj).valor;
            cc.x=lista2.get(jj).x;
            cc.y=lista2.get(jj).y;
            lista.add(cc);
        }

        int primerr[]= new int[num];
        int pos=iRandom(cont);
        primerr[0]=pos;
        int posPrimer=1;

        while (lista.size()>1){
            double distanciamayor=padre.AltoMapa*padre.AnchoMapa;
            int d=0;
            for (int i=0;i<lista.size();i++){
                if (i!=pos){
                    double distancia=(lista.get(i).x-lista.get(pos).x)*(lista.get(i).x-lista.get(pos).x)+(lista.get(i).y-lista.get(pos).y)*(lista.get(i).y-lista.get(pos).y);
                    distancia=Math.sqrt(distancia);
                    if (distancia<distanciamayor){
                        distanciamayor=distancia;
                        d=i;
                    }
                }
            }
            primerr[posPrimer]=lista.get(d).valor;
            posPrimer++;
            lista.remove(pos);
            if (pos<d) d--;
            pos=d;
        }
        primerrr[iii]=primerr;
    
   }
    
    
    
    
    
    long start = System.currentTimeMillis();
    TSP tsp= new TSP (costos,num,arrUbi,cont,iRandom(cont),primerrr);
    tsp.Init();  
    long end = System.currentTimeMillis();
    javax.swing.JOptionPane jOP = new javax.swing.JOptionPane(); 
    
    System.out.print("Tiempo: "+( end - start )/1000.0 +" sec\n");
    
}//GEN-LAST:event_jButton1ActionPerformed
 /*
    
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
// TODO add your handling code here:
    //primero lleno MUbi
    padre.MUbi=new int[padre.AltoMapa][padre.AnchoMapa];
    for (int i=0;i<padre.AltoMapa;i++){
        for (int j=0;j<padre.AnchoMapa;j++){
                padre.MUbi[i][j]=0;
        }
    }
    
    BufferedReader fin=null;
    try{
            fin = new BufferedReader(new FileReader("./ubi.txt"));
    }catch(IOException e){
        javax.swing.JOptionPane jOP = new javax.swing.JOptionPane(); 
        jOP.showMessageDialog(null, "Error de lectura","", 0);
    }
    String strAux=new String();
    int x,y,sourceX=0,sourceY=0;
    boolean primer=true;
    while(true){
        try{
            strAux = fin.readLine();
            if (strAux==null) break;
            int cont=0;
            x=0;
            while (strAux.charAt(cont) !=' '){
                x=x*10+Integer.parseInt(""+strAux.charAt(cont));                
                cont++;
            }
            cont++;
            y=0;            
            for (int ii=cont;ii<strAux.length();ii++){
                y=y*10+Integer.parseInt(""+strAux.charAt(ii));  
            }
            if (primer==true){
                sourceX=x;
                sourceY=y;
                primer=false;
            }
            padre.MUbi[y][x]=1;
            
        }catch(Exception e){System.out.print("Error en leer\n");}   
        
    }
    

        
    //calculo numeros y lleno Numeros
    int num=1;
    arrNumeros=new int[padre.AltoMapa][padre.AnchoMapa];
    for (int i=0;i<padre.AltoMapa;i++){
        for (int j=0;j<padre.AnchoMapa;j++){
            if (padre.MMapa[i][j]==0){
                if (EsNumero(i,j)==true){
                    PMapa.botones[i][j].setText(""+num);
                    arrNumeros[i][j]=num;
                    num++;
                }
                else{
                    arrNumeros[i][j]=0;
                    PMapa.botones[i][j].setText("");
                }
            }
            else{                        
                arrNumeros[i][j]=0;
                PMapa.botones[i][j].setText("");
            }
        }
    }
    
    //lleno los costos
    int costos[][]=new int[num][num];
    int cont;
    
    for (int i=0;i<num;i++)
        for (int j=0;j<num;j++)
            costos[i][j]=0;
    
    for (int i=0;i<padre.AltoMapa;i++){
        for (int j=0;j<padre.AnchoMapa;j++){
            if (arrNumeros[i][j]!=0){
                //abajo
                cont=1;
                for (int k=i-1;k>=0;k--){
                    if (padre.MMapa[k][j]!=0)
                        break;
                    if (arrNumeros[k][j]!=0){
                        costos[arrNumeros[i][j]][arrNumeros[k][j]]=cont;
                        costos[arrNumeros[k][j]][arrNumeros[i][j]]=cont;
                        break;
                    }
                    cont++;
                }
                //arriba
                cont=1;
                for (int k=i+1;k<padre.AltoMapa;k++){
                    if (padre.MMapa[k][j]!=0)
                        break;
                    if (arrNumeros[k][j]!=0){
                        costos[arrNumeros[i][j]][arrNumeros[k][j]]=cont;
                        costos[arrNumeros[k][j]][arrNumeros[i][j]]=cont;
                        break;
                    }
                    cont++;
                }
                //izquierda
                cont=1;
                for (int k=j-1;k>=0;k--){
                    if (padre.MMapa[i][k]!=0)
                        break;
                    if (arrNumeros[i][k]!=0){
                        costos[arrNumeros[i][j]][arrNumeros[i][k]]=cont;
                        costos[arrNumeros[i][k]][arrNumeros[i][j]]=cont;
                        break;
                    }
                    cont++;
                }
                //derecha
                cont=1;
                for (int k=j+1;k<padre.AnchoMapa;k++){
                    if (padre.MMapa[i][k]!=0)
                        break;
                    if (arrNumeros[i][k]!=0){
                        costos[arrNumeros[i][j]][arrNumeros[i][k]]=cont;
                        costos[arrNumeros[i][k]][arrNumeros[i][j]]=cont;
                        break;
                    }
                    cont++;
                }    
            }
        }    
    }    
    // ya llene los costos
    
    
    
    int arrUbi[]=new int[numUbi+1];
    
    //20070263 añado source
    cont=0;
    int source=0;
    for (int i=0;i<padre.AltoMapa;i++)
        for (int j=0;j<padre.AnchoMapa;j++){
            if (padre.MUbi[i][j]!=0){
                arrUbi[cont]=arrNumeros[i][j];
                if ((i==sourceY)&&(j==sourceX))
                    source=cont;
                cont++;
            }
        }
           
    
    
    
    class cosa{
        int valor;
        int x;
        int y;
    }
    List<cosa> lista2 =new ArrayList<cosa>();
    
    
    cosa c= new cosa();
    int contador;
    contador=0;
    
    
    for (int i=0;i<padre.AltoMapa;i++)
        for (int j=0;j<padre.AnchoMapa;j++){
            if (padre.MUbi[i][j]==1){
                c= new cosa();
                c.x=j;
                c.y=i;
                c.valor=contador;
                lista2.add(c);
                contador++;
            }
        }
    
    int primerrr[][]=new int[10][cont];
   for (int iii=0;iii<10;iii++){
    
        List<cosa> lista =new ArrayList<cosa>();
        for (int jj=0;jj<lista2.size();jj++){
            cosa cc=new cosa();
            cc.valor=lista2.get(jj).valor;
            cc.x=lista2.get(jj).x;
            cc.y=lista2.get(jj).y;
            lista.add(cc);
        }

        int primerr[]= new int[num];
        int pos=iRandom(cont);
        primerr[0]=pos;
        int posPrimer=1;

        while (lista.size()>1){
            double distanciamayor=padre.AltoMapa*padre.AnchoMapa;
            int d=0;
            for (int i=0;i<lista.size();i++){
                if (i!=pos){
                    double distancia=(lista.get(i).x-lista.get(pos).x)*(lista.get(i).x-lista.get(pos).x)+(lista.get(i).y-lista.get(pos).y)*(lista.get(i).y-lista.get(pos).y);
                    distancia=Math.sqrt(distancia);
                    if (distancia<distanciamayor){
                        distanciamayor=distancia;
                        d=i;
                    }
                }
            }
            primerr[posPrimer]=lista.get(d).valor;
            posPrimer++;
            lista.remove(pos);
            if (pos<d) d--;
            pos=d;
        }
        primerrr[iii]=primerr;
    
   }
    
    
    
    
    
    long start = System.currentTimeMillis();
    TSP tsp= new TSP (costos,num,arrUbi,cont,source,primerrr);
    tsp.Init();  
    long end = System.currentTimeMillis();
    javax.swing.JOptionPane jOP = new javax.swing.JOptionPane(); 
    
    System.out.print("Tiempo: "+( end - start )/1000.0 +" sec\n");
        
    //jOP.showMessageDialog(null,"Tiempo: "+( end - start )/1000.0 +" sec"); 
}      
   */ 

boolean EsNumero (int i,int j){
        
        if (padre.MUbi[i][j]==1){
            numUbi++;
            return true;
        }
        else{
            //arriba
            //   1
            // 7   3
            //   5
            int suma=0;

            if (i!=0){
                if (padre.MMapa[i-1][j]==0){
                    suma+=1;
                }  
            }
            if (i!=padre.AltoMapa-1){
                if (padre.MMapa[i+1][j]==0){
                    suma+=5;
                }  
            }

            if (j!=0){
                if (padre.MMapa[i][j-1]==0){
                    suma+=7;
                }  
            }
            if (j!=padre.AnchoMapa-1){
                if (padre.MMapa[i][j+1]==0){
                    suma+=3;
                }  
            }        
            if ((suma==10)||(suma==6)) return false;
            else
                return true;
        }
    }
    int iRandom(int num){
                        int temp = rd.nextInt(num);
                        return temp;
                }      // int Random generator
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JTextField jTextField1;
    // End of variables declaration//GEN-END:variables
}
